home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / KEYBOARD.D < prev    next >
Encoding:
Modula Definition  |  1989-09-06  |  10.2 KB  |  240 lines

  1. DEFINITION MODULE Keyboard;
  2.  
  3.  (*
  4.   *                                       Thomas Tempelmann 28.08.88
  5.   *                                             Für Megamax Modula-2
  6.   *
  7.   *   Dieses Modul bietet Funktionen zum Auswerten der erweiterten
  8.   *   Tastencodes, wie sie z.B. von den Funktionstasten und den
  9.   *   Cursortasten erzeugt werden.
  10.   *
  11.   *   Es sind auch Funktionen vorhanden, die zwischen verschiedenen
  12.   *   internen Darstellungsformaten von Tasten mit Scan-Codes konvertieren.
  13.   *   (z.B. von 'GEMGlobals.GemChar/.SpecialKeySet' nach dem hier verwendeten
  14.   *   'Key'-Type).
  15.   *
  16.   * ---------------------
  17.   *  30.08.89  TT  Die Tastenabfragefunktionen wurden entfernt;
  18.   *                intern wurden Belegung von wdLeft/Right und soln/eoln
  19.   *                vertauscht.
  20.   *
  21.   *)
  22.  
  23. FROM MOSGlobals IMPORT Key;
  24. FROM SYSTEM IMPORT LONGWORD, WORD, BYTE;
  25.  
  26.  
  27. PROCEDURE GemCharToKey (gemChar: WORD; specialKeySet: BYTE; VAR k: Key);
  28. PROCEDURE KeyToGemChar (k: Key; VAR gemChar: WORD; VAR specialKeySet: BYTE);
  29.   (*
  30.    * Konvertieren Werte aus 'GEMGlobals.GemChar' und 'GEMGlobals.SpecialKeySet'
  31.    * nach 'Key' und umgekehrt.
  32.    *)
  33.  
  34. PROCEDURE LongToKey (l: LONGWORD; VAR k: Key);
  35. PROCEDURE KeyToLong (k: Key; VAR l: LONGWORD);
  36.   (*
  37.    * Konvertieren Tastenwerte, die in einem Longword (4 Byte) abgelegt sind
  38.    * (z.B. von den BIOS- und GEMDOS-Funktionen) nach 'Key' und umgekehrt.
  39.    *)
  40.  
  41.  
  42.  (*
  43.   * Sollen in einem Programm Sondertasten, wie die Help-Taste oder den
  44.   * Funktionstasten, abgefragt werden, gibt es dazu zwei Möglichkeiten.
  45.   * Entweder man orientiert sich nur an den von Atari vordefinierten
  46.   * Tastencodes (Kombination aus dem Scan- und dem ASCII-Code) oder
  47.   * man erkennt die Taste als solche und berücksichtigt dann die evtl.
  48.   * zusätzlichen Kontrolltasten, wie Shift, Control und Alternate.
  49.   *
  50.   * Die erste Möglichkeit ist einfacher zu realisieren, jedoch ein-
  51.   * schränkend da nicht alle Tastenkombinationen kodiert sind. So
  52.   * erhält man bei den 10 Funktionstasten nur 20 Kombinationen, indem
  53.   * entweder die Funktionstasten alleine oder mit der Shift-Taste ver-
  54.   * wendet werden. Zusätzlich gedrückte Alternate- oder Control-Tasten
  55.   * werden ignoriert. Ebensolches zeigt sich auch bei anderen Tasten.
  56.   *
  57.   * Besteht Bedarf, auch unkodierte Kombinationen zu erkennen, muß man
  58.   * sich eines umständlicheren Verfahrens bedienen. Denn auch die Tasten
  59.   * sind nicht immer einfach an ihrem Scan-Code erkennbar, denn das TOS
  60.   * simuliert durch Kombination mit z.B. der Alternate-Taste die Bedie-
  61.   * nung anderer, nicht wirklich vorhandener, Tasten.
  62.   * So kann man das Drücken von Alternate-X nicht durch Erkennen des
  63.   * ASCII-Codes 'X' (oder auch noch 'x') und des Alternate-Tastenstatus
  64.   * ermitteln sondern muß darauf gefaßt sein, daß diese Kombination schon
  65.   * einen eigenen Scan/ASCII-Code hat.
  66.   * Auch das Abfragen der Funktionstasten ist umständlich. Liefert F1
  67.   * alleine den Scan-Code $3B, in Verbindung mit Shift den Code $54,
  68.   * was die imaginäre Taste F11 simuliert.
  69.   * Soll Control-F1 erkannt werden, muß also F1 und die Control-Taste
  70.   * abgefragt werden, bei Alternate/Shift-F1 muß der Alternate-Status
  71.   * und die F11-Taste abgefragt werden. Soll, was bei der vorigen
  72.   * Kombination zweier Kontrolltasten sinnvoll ist, der Unterschied
  73.   * zwischen Alternate-F1 und Alternate/Shift-F1 erkannt werden, ist
  74.   * zu Bedenken, daß die Shift-Taste im ersten Fall nicht, im anderen
  75.   * Fall aber doch im Kontrolltasten-Status registiert ist.
  76.   * Aus diesem Grund wird hier die Funktion 'KeyCap' bereitgestellt,
  77.   * die einem die Arbeit der Tastenerkennung abnimmt. Sie liefert einen
  78.   * Wert des Aufzählungstyps 'Cap', der die Taste als solche beschreibt.
  79.   * Es braucht dann nur noch der Kontrolltasten-Status abgefragt werden
  80.   * (der steht im 'Key'-Record).
  81.   *
  82.   * Tastenkombinationen sollten also entweder mit der 'SpecialKey'-Funktion
  83.   * (s.u.) oder kombiniert mit 'KeyCap' und dem Kontrolltasten-Status
  84.   * ermittelt werden, jedoch nie aus einer Vermischung von Kontrolltasten-
  85.   * Abfrage und 'SpecialKey'-Funktion.
  86.   *
  87.   * Sollen normale ASCII-Zeichen alle normal behandelt werden, sind die
  88.   * anderen Sondertasten (Funktionstasten, Cursortasten, Insert, ..., aber
  89.   * nicht Esc, Return, Delete usw.) mit der 'IsCharacter'-Funktion
  90.   * (wenn sie FALSE liefert) zu behandeln.
  91.   * Sollen dagegen auch z.B. Control-Tasten (Control-A .. Control-Z)
  92.   * behandelt werden, ist nicht deren ASCII-Code dazu abzufragen (denn
  93.   * Return liefert z.B. den gleichen Code wie Control-M), sondern erstmal
  94.   * die Funktion 'IsSpecial' oder gleich 'SpecialKey' zu befragen.
  95.   * Es geht natürlich auch, einfach nur Abzufragen, ob die Help-Taste
  96.   * gedrückt wurde (IF SpecialKey (k) = help THEN ...)
  97.   *)
  98.  
  99.  
  100. TYPE
  101.  
  102.   Cap = (unspecCap, escCap, tabCap, backspaceCap, deleteCap,
  103.          returnCap, enterCap, helpCap, undoCap, insertCap, clrHomeCap,
  104.          upCap, downCap, leftCap, rightCap, f1Cap, f2Cap,
  105.          f3Cap, f4Cap, f5Cap, f6Cap, f7Cap, f8Cap, f9Cap, f10Cap);
  106.       (*
  107.        * Alle in der Aufzählung enthaltenen Tasten werden immer
  108.        * so erkannt, wie die Tasten für den Benutzer sichtbar sind,
  109.        * unabhängig davon, ob zusätzlich z.B. eine Shift-Taste
  110.        * gedrückt wird. Um also zu ermitteln, ob F1 oder Shift-F1 gedrückt
  111.        * wurde, muß nach Erkennen von 'f1Cap' (aus dieser Aufzählung) im
  112.        * 'ctrl'-Feld des 'Key'-Records die Shift-Taste abgefragt werden.
  113.        *)
  114.  
  115. PROCEDURE KeyCap (VAR k: Key): Cap;
  116.   (*
  117.    * Wird 'unspecCap' geliefert, ist die Taste keine der in der Aufzählung
  118.    * 'Cap' enthaltenen Tasten.
  119.    * Sollen die Alternate-Kombinationen mit Buchstaben oder Ziffern (nur
  120.    * auf dem Buchstabenblock, aber nicht auf dem Ziffernblock möglich)
  121.    * erkannt werden, muß die Auswertung über die Funktion 'SpecialKey'
  122.    * erfolgen.
  123.    *)
  124.  
  125.  
  126. TYPE
  127.  
  128.   SpecialCode = (unspecKey, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10,
  129.                  f11, f12, f13, f14, f15, f16, f17, f18, f19, f20,
  130.                  esc, tab, backspace, delete, delLine, insert, insLine,
  131.                  return, enter, up, down, left, right, pgUp, pgDown,
  132.                  wdLeft, wdRight, soln, eoln, clr, home, help, undo,
  133.                  ctrlA, ctrlB, ctrlC, ctrlD, ctrlE, ctrlF, ctrlG, ctrlH,
  134.                  ctrlI, ctrlJ, ctrlK, ctrlL, ctrlM, ctrlN, ctrlO, ctrlP,
  135.                  ctrlQ, ctrlR, ctrlS, ctrlT, ctrlU, ctrlV, ctrlW, ctrlX,
  136.                  ctrlY, ctrlZ,
  137.                  alt1, alt2, alt3, alt4, alt5, alt6, alt7, alt8, alt9, alt0,
  138.                  altA, altB, altC, altD, altE, altF, altG, altH,
  139.                  altI, altJ, altK, altL, altM, altN, altO, altP,
  140.                  altQ, altR, altS, altT, altU, altV, altW, altX,
  141.                  altY, altZ);
  142.        (*
  143.         * 'return' ist die Return-Taste auf dem alphanum. Tastenblock,
  144.         * 'enter' ist die Enter-Taste auf dem Ziffernblock.
  145.         * F11-F20 werden durch Shift-F1 bis Sihft-F10 eingegeben.
  146.         * 'home' ist die "Clr/Home"-Taste ohne, 'clr' mit der Shift-Taste.
  147.         * 'pgUp' / 'pgDown' werden mit Shift-Auf-/Ab-Pfeilen,
  148.         * 'wdLeft' / 'wdLeft' Shift-Links-/Rechts-Pfeilen und
  149.         * 'soln' / 'eoln' durch Control-Links-/Rechts-Pfeilen eingegeben.
  150.         * 'delLine' wird mit Control-Delete,
  151.         * 'insLine' mit Shift-Insert erreicht.
  152.         * Es wird dafür gesorgt, daß z.B. das Drücken von Alternate und 'Z'
  153.         * immer 'altZ' zum Ergebnis hat, unabhängig davon, wo die 'Z'-Taste
  154.         * landesabhängig auf der Tastatur angebracht ist.
  155.         *)
  156.  
  157. PROCEDURE SpecialKey (VAR k: Key): SpecialCode;
  158.   (*
  159.    * Wird 'unspecKey' geliefert, ist die Taste keine der in der Aufzählung
  160.    * 'SpecialCode' enthaltenen Tasten (und 'IsSpecial' liefert FALSE).
  161.    *)
  162.  
  163.  
  164. PROCEDURE IsSpecial (VAR k: Key): BOOLEAN;
  165.   (*
  166.    * Liefert TRUE, wenn die Taste eine Sondertaste ist.
  167.    * Als Sondertasten zählen (fast) alle nicht-druckbaren Zeichen, also
  168.    * die Funktionstasten, die Cursortasten, die Buchstabentasten mit
  169.    * Control und Alternate, die Tasten Esc, Help, Home, Return, Enter,
  170.    * Backspace, Tab, Delete, Insert, Undo und die Alternate-Kombinationen
  171.    * mit den Ziffern des Buchstabenblocks, kurz: alle in 'SpecialCode'
  172.    * aufgezählten Tasten.
  173.    * Control-M wird beispielsweise von dieser Funktion nicht mit 'Return'
  174.    * verwechselt.
  175.    * Diese Funktion ist nicht die Inversion zu 'IsCharacter' !
  176.    * Es ist auch zu beachten, daß nicht alle undruckbaren Zeichen hiermit
  177.    * erkannt werden, so z.B. nicht Control-Kombinationen mit den Tasten
  178.    * rechts der Buchstabentasten.
  179.    *)
  180.  
  181. PROCEDURE IsCharacter (VAR k: Key): BOOLEAN;
  182.   (*
  183.    * Liefert TRUE, wenn die Taste ein normales Zeichen darstellt,
  184.    * das auch z.B. mit 'Terminal.Read' gelesen werden würde.
  185.    * Dazu gehören alle druckbaren Zeichen, sowie Control-Zeichen,
  186.    * Esc, Return, Enter, Backspace, Delete und Tab.
  187.    * Alle solche Zeichen enthalten in 'c.ch' den ASCII-Code und
  188.    * können mit den Funktionen aus 'Characters' weiterverarbeitet
  189.    * werden.
  190.    *)
  191.  
  192. PROCEDURE IsASCII (VAR k: Key): BOOLEAN;
  193.   (*
  194.    * Genau wie 'IsCharacter'.
  195.    *)
  196.  
  197.  
  198. PROCEDURE IsCursor (VAR k: Key): BOOLEAN;
  199.   (*
  200.    * Liefert TRUE, wenn die Taste eine Cursor-Taste (Pfeiltasten,
  201.    * auch mit Shift- oder Ctrl) ist.
  202.    *)
  203.  
  204. PROCEDURE IsAlternate (VAR k: Key): BOOLEAN;
  205.   (*
  206.    * Liefert TRUE, wenn die Taste Alternate-A bis Alternate-Z oder
  207.    * Alternate-1 bis Alternate-0 ist.
  208.    *)
  209.  
  210. PROCEDURE IsFunction (VAR k: Key): BOOLEAN;
  211.   (*
  212.    * Liefert TRUE, wenn die Taste eine Funktionstaste ist.
  213.    *)
  214.  
  215.  
  216. PROCEDURE OnNumBlock (VAR k: Key): BOOLEAN;
  217.   (*
  218.    * Liefert TRUE, wenn die Taste vom Ziffernblock stammt.
  219.    * Damit kann unterschieden werden, ob ASCII-Zeichen auf dem Ziffernblock
  220.    * eingegeben wurden, die weitere Auswertung kann auf das Abfragen der
  221.    * Scan-Codes somit verzichten.
  222.    *)
  223.  
  224. PROCEDURE OnAlphaBlock (VAR k: Key): BOOLEAN;
  225.   (*
  226.    * Liefert TRUE, wenn die Taste vom Buchstabenblock stammt.
  227.    *)
  228.  
  229. PROCEDURE OnCursorBlock (VAR k: Key): BOOLEAN;
  230.   (*
  231.    * Liefert TRUE, wenn die Taste vom Cursor-Block stammt.
  232.    *)
  233.  
  234. PROCEDURE OnFunctionBlock (VAR k: Key): BOOLEAN;
  235.   (*
  236.    * Liefert TRUE, wenn die Taste vom Funktionstasten-Block stammt.
  237.    *)
  238.  
  239. END Keyboard.
  240.